package com.example.httpapplication;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import com.loopj.android.image.SmartImageView;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private TextView tvTitle;
    String data="";//接收的服务器数据
    private Bitmap bm;//新闻图片，从服务器获取
    private ImageView imPic;//图片框
    SmartImageView smartImageView;
    ListView lvNews;
    static  int flag;//数据是否获取到的标记
    static  String message;//子线程拿到的数据
    //处理消息的对象-----发消息（子线程），接收消息（主线程）
    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //收到消息之后，处理消息的代码
            tvTitle.setText(msg.obj.toString());
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvTitle = (TextView) findViewById( R.id.tv_title);
        Button btnRequest= (Button) findViewById( R.id.btn_request);
        imPic = (ImageView) findViewById(R.id.im_pic);
        smartImageView= (SmartImageView) findViewById(R.id.smart_iv);
        lvNews= (ListView) findViewById(R.id.lv_news);
        //访问服务器获取json文件
        getNewsJsonFromServer();


        btnRequest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //点击按钮，访问服务器上新闻网站的数据
                //服务器的地址"http://localhost:8080/news/title.txt"
                //okhttp
                getDataByOkHTTP();
                getPicByOkHTTP();
                smartImageView.setImageUrl("http://10.131.2.93:8080/news/pic/pic01.jpeg");




                //开启一个子线程访问服务器，获取数据
                //getDataFromServer();
                //getPicFromServer();

                /*


                //主线程需要知道什么时候子线程获取到了数据
                //当子线程没有拿到数据的时候，主线程等待
                while(flag==0){
                    //等待
                }
                //判断flag==1,获取数据之后,在主线程中展示数据
                tvTitle.setText(message);

                */
            }
        });


    }

    private void getNewsJsonFromServer() {
        //教师机的ip=10.131.2.93
        String ip="http://10.131.2.93:8080/news/news.json";
        OkHttpClient client=new OkHttpClient();
        Request request=new Request.Builder().url(ip).build();
        Call call=client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                Toast.makeText(getApplicationContext(),"访问失败",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onResponse(Response response) throws IOException {
                //1-获取服务器传回来的json数据
                String json=new String(response.body().bytes(),"utf-8");
                Log.i("MainActivity", "json= "+json);
                //2-解析，将json数组解析为新闻实体类的列表newsList

                final ArrayList<NewBean> newsList=parseJson(json);
                //3-展示列表中的数据，ListView
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        lvNews.setAdapter(new BaseAdapter() {
                            @Override
                            public int getCount() {
                                return newsList.size();
                            }

                            @Override
                            public Object getItem(int i) {
                                return null;
                            }

                            @Override
                            public long getItemId(int i) {
                                return 0;
                            }

                            @Override
                            public View getView(int i, View view, ViewGroup viewGroup) {
                                 View itemview=View.inflate(getApplicationContext(),R.layout.list_item,null);
                                TextView tvTitle= (TextView) itemview.findViewById(R.id.tv_item_title);
                                SmartImageView sivPic= (SmartImageView) itemview.findViewById(R.id.siv_item_pic);
                                tvTitle.setText(newsList.get(i).getTitle());
                                String ip=newsList.get(i).getIcon();
                                sivPic.setImageUrl(ip);
                                return itemview;
                            }
                        });
                    }
                });

            }
        });
    }

    private ArrayList<NewBean> parseJson(String json) {
        ArrayList<NewBean> newsList;
        Gson gson=new Gson();
        Type newsType=new TypeToken<ArrayList<NewBean>>(){}.getType();
        newsList=gson.fromJson(json,newsType);
        Log.i("MainActivity", "解析json的结果: "+newsList.get(0).getTitle());
        return newsList;

    }

    private void getPicByOkHTTP() {
        //服务器的地址10.131.2.93
        //ip地址
        String ip="http://10.131.2.93:8080/news/pic/pic01.jpeg";
        //2-创建okhttp的客户端
        OkHttpClient client=new OkHttpClient();
        //3-封装一个请求对象
        Request request=new Request.Builder().url(ip).build();
        //4-发送请求
        Call call=client.newCall(request);
        //5-将发送请求添加到队列。处理回调
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                //失败
            }

            @Override
            public void onResponse(Response response) throws IOException {
                //成功
                //获取服务器相应的数据，展示
                //参数1==字节数组，参数2=起始位置，参数3==长度
                final  Bitmap bitmap=BitmapFactory.decodeByteArray(response.body().bytes(),0, (int) response.body().contentLength());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        imPic.setImageBitmap(bitmap);
                    }
                });



            }
        });
    }

    private void getDataByOkHTTP() {
        //ip地址
        String ip="http://10.0.2.2:8080/news/title.txt";
        //2-创建okhttp的客户端
        OkHttpClient client=new OkHttpClient();
        //3-封装一个请求对象
        Request request=new Request.Builder().url(ip).build();
        //4-发送请求
        Call call=client.newCall(request);
        //5-将发送请求添加到队列。处理回调
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                //失败
            }

            @Override
            public void onResponse(Response response) throws IOException {
                //成功
                //获取服务器相应的数据，展示
                final String data=new String(response.body().bytes(),"utf-8");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvTitle.setText(data);
                    }
                });



            }
        });
    }

    private void getPicFromServer() {
        //耗时操作,放在子线程中进行
        new Thread(new Runnable() {
            @Override
            public void run() {
                //访问网络
                //1-地址"http://localhost:8080/news/pic/pic01.jpeg"
                //localhost--本地主机---手机
                //本地计算机ip地址=10.0.2.2
                String ip="http://10.0.2.2:8080/news/pic/pic01.jpeg";

                try {
                    //2-将地址封装成URL
                    URL url=new URL(ip);
                    //3-开启网络连接
                    HttpURLConnection conn= (HttpURLConnection) url.openConnection();
                    //4-设置连接的超时时间
                    conn.setConnectTimeout(2000);//毫秒计数
                    //5-读取服务器的输入流的数据
                    if (conn.getResponseCode()==200){
                        InputStream in=conn.getInputStream();//从连接中获取输入流
                        //文件图像

                        bm = BitmapFactory.decodeStream(in);
                    }
                    //bm就是获取到的服务器图片数据

                    //显示在界面上的图片框
                    //只有主线程才能操作界面控件，子线程不行
                    //在主线程执行操作
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //
                            imPic.setImageBitmap(bm);
                        }
                    });




                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }

    private void getDataFromServer() {
        //耗时操作,放在子线程中进行
        //初始化标记
        //flag=0;//没有拿到数据
        new Thread(new Runnable() {
            @Override
            public void run() {
                //访问网络
                //1-地址"http://localhost:8080/news/title.txt"
                //localhost--本地主机---手机
                //本地计算机ip地址=10.0.2.2
                String ip="http://10.0.2.2:8080/news/title.txt";

                try {
                    //2-将地址封装成URL
                    URL url=new URL(ip);
                    //3-开启网络连接
                    HttpURLConnection conn= (HttpURLConnection) url.openConnection();
                    //4-设置连接的超时时间
                    conn.setConnectTimeout(2000);//毫秒计数
                    //5-读取服务器的输入流的数据
                    if (conn.getResponseCode()==200){
                        InputStream in=conn.getInputStream();//从连接中获取输入流
                        byte[]buf=new byte[1024];
                        int len;

                        while((len=in.read(buf))!=-1){
                            data=data+new String(buf,0,len);
                        }
                    }
                    //data就是获取到的服务器数据

                    Log.i("MainActivity", "getDataFromServer: "+data);
                    //方案1-通过标记，，拿到了数据，改变标记
                    //flag=1;
                    //通过静态变量把数据传递给主线程
                    //message=data;
                    //方案2---消息
                    //拿到数据之后，向主线程发消息
                    //[1]封装一个消息对象
                    Message handledMessage=new Message();
                    //[2]将数据放到消息中
                    handledMessage.obj=data;
                    //[3]使用handler对象把消息发出去
                    handler.sendMessage(handledMessage);

                    //显示在界面上的文本框
                    //只有主线程才能操作界面控件，子线程不行
                    //在主线程执行操作
//                    runOnUiThread(new Runnable() {
//                        @Override
//                        public void run() {
//                            tvTitle.setText(data);//
//                        }
//                    });




                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();


    }
}
